﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace StoreManager.Models
{
    public class Store:BaseModel
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int StoreID { get; set; }

        [Required]
        public int FinancialYear { get; set; }

        [Required]
        public DateTime YearStartDate { get; set; }
        [Required]
        public DateTime YearEndDate { get; set; }

        [Required]
        public int ImportQuantity { get; set; }

        [Required]
        public int ExportQuantity { get; set; }

        [Required]
        public int ResidualQuantity { get; set; }

        [Required]
        public int PromoQuantity { get; set; }

        [Required]
        public int DamagedQuantity { get; set; }

        [Required]
        public int LostQuantity { get; set; }

        public int ProductID { get; set; }
        public virtual Product Product { get; set; }

    }

    [Table("Staffs")]
    public class Staff : BaseModel
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int StaffID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Họ và Tên")]
        public string Name { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]      
        [Display(Name = "Ngày Sinh")]
        public DateTime DOB { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Ngày Vào Công Ty")]
        public DateTime StartDate { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Trạng Thái")]
        public string Status { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Số Di Động")]
        public string MobileNo { get; set; }
       
        [StringLength(20)]
        [Display(Name = "Số Điện Thoại Nhà Riêng")]
        public string HomePhonNo { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(100)]
        [Display(Name = "Số Nhà/Tòa Nhà")]
        public string HouseNo { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(100)]
        [Display(Name = "Phố/Đường/Khu")]
        public string Street { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]        
        [Display(Name = "Quận/Huyện")]
        public int DistrictID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]        
        [Display(Name = "Tỉnh/Thành Phố")]
        public int CityID { get; set; }
    }

    [Table("Customer")]
    public class Customer : BaseModel
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int CustomerID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tên Đại Lý")]
        public string Name { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tên Người Đại Diện")]
        public string ReprentativeName { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Đăng Ký Với Công Ty")]
        public DateTime RegisteredDate { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Ngày Bắt Đầu Giao Dịch ")]
        public DateTime StartDate { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Trạng Thái")]
        public string Status { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Số Di Động")]
        public string MobileNo { get; set; }

        [StringLength(20)]
        [Display(Name = "Số Điện Thoại Văn Phòng")]
        public string HomePhonNo { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(100)]
        [Display(Name = "Số Nhà/Tòa Nhà")]
        public string HouseNo { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(100)]
        [Display(Name = "Phố/Đường/Khu")]
        public string Street { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Quận/Huyện")]
        public int DistrictID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tỉnh/Thành Phố")]
        public int CityID { get; set; }
    }
    [Table("Suppliers")]
    public class Supplier : BaseModel
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int SupplierID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tên Nhà Cung Cấp")]
        public string Name { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tên Người Đại Diện")]
        public string ReprentativeName { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Ngày Bắt Đầu Giao Dịch ")]
        public DateTime StartDate { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Trạng Thái")]
        public string Status { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Số Di Động")]
        public string MobileNo { get; set; }

        [StringLength(20)]
        [Display(Name = "Số Điện Thoại Văn Phòng")]
        public string HomePhonNo { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(100)]
        [Display(Name = "Số Nhà/Tòa Nhà")]
        public string HouseNo { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(100)]
        [Display(Name = "Phố/Đường/Khu")]
        public string Street { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Quận/Huyện")]
        public int DistrictID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tỉnh/Thành Phố")]
        public int CityID { get; set; }
    }
    [Table("Cities")]
    public class City
    {
        [Key]        
        public int CityID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tên Đại Lý")]
        public string Name { get; set; }
    }
    [Table("Districts")]
    public class District
    {
        [Key]
        public int DistrictID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(50)]
        [Display(Name = "Tên Đại Lý")]
        public string Name { get; set; }

        [Required]
        public int CityID { get; set; }
    }
    // Map this class with table in database
    [Table("ImportOrders")]
    public class ImportOrder : BaseModel
    {
        public ImportOrder()
        {            
             ImportOrderDetails = new List<ImportOrderDetail>();
             Status = SMCodes.IMP_STATUS_CODE_VALID;
        }
        [Key]
        [Required]
        public Guid ImportOrderID { get; set; }

        [Required]
        [Display(Name = "Số Đơn Hàng")]
        public String ImportOrderNo { get; set; } 

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Nhân Viên Nhập Hàng")]
        public int StaffID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Ngày Nhập")]
        public DateTime ImportDate { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Nhà Cung Cấp")]
        public int SupplierID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Trạng Thái")]
        public string Status { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Loại Hóa Đơn")]
        public string Type { get; set; }

        public IList<ImportOrderDetail>  ImportOrderDetails{get;set;}
    }

    [Table("ImportOrderDetails")]
    public class ImportOrderDetail : TransactionBase
    {
        public ImportOrderDetail()
        {
            ImportOrderDetailsID = Guid.NewGuid();
        }
        [Key]
        [Required]
        public Guid ImportOrderDetailsID { get; set; }
        [Required]
        public Guid ImportOrderID { get; set; }
        public virtual ImportOrder ImportOrder { get; set; }
    }

    /// <summary>
    /// Basic class for Order classes which contain basic fields
    /// </summary>
    public class TransactionBase : BaseModel
    {
        public TransactionBase()
        {
            Type = SMGroupCodes.IMPORT_TRANS;
        }
        [Required(ErrorMessage = MSG.REQUIRED)]
        [StringLength(20)]
        [Display(Name = "Loại Sản Phẩm")]
        public string Type { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Sản Phẩm")]
        public int ProductID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Giá")]
        [Range(0, 1000000, ErrorMessage = MSG.RANGE)]
        public decimal Price { get; set; }


        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Số Lượng")]
        [Range(0, 1000000, ErrorMessage = MSG.RANGE)]
        public int Quantity { get; set; }

        //Tong gia tri
    }

    [Table("ExportOrders")]
    public class ExportOrder : TransactionBase
    {

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Sản Phẩm")]
        public int ProductID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Nhân Viên Bán")]
        public int StaffID { get; set; }

        [Required(ErrorMessage = MSG.REQUIRED)]
        [Display(Name = "Xuất Cho Đại Lý")]
        public int DealerID { get; set; }

    }
}